package com.wb.util;


import java.io.*;

/**
 * @author 黄衡熙
 * @version 1.0
 */
public class FileUtil {

    /*
     * 将一个文件拷贝到指定的文件目录中
     * @param src  源文件
     * @param target 目标文件
     * */
    public static void copyFile(File src, File target) throws IOException {
        if (!src.exists()) {
            throw new FileNotFoundException("源文件不存在: " + src.getAbsolutePath());
        }
        // 检查目标目录是否存在，不存在则创建
        File parent = target.getParentFile();
        if (parent != null && !parent.exists()) {
            parent.mkdirs();
        }
        try (
                InputStream in = new FileInputStream(src);
                OutputStream out = new FileOutputStream(target)
        ) {
            byte[] buffer = new byte[1024];
            int bytesRead;

            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        }
    }

    /*
     * 将一个文件拷贝到指定的文件中
     * @param src 源文件
     * @param target 目标文件
     * */
    public static void copyFile(String src, String target) {
        File srcFile = new File(src);
        File targetFile = new File(target);
        if (!srcFile.exists()) {
            throw new FileNotFoundException(src);
        }
        if (!targetFile.exists()) {
            throw new FileNotFoundException(target);
        }
        copyFile(src, target);
    }




    /*
    * 将一个文件目录中所有文件拷贝到指定目录中
    * @param src 源目录
    * @param target 目标目录
    * */
    public static void copyDirectory(String src, String target) {
        File file1 = new File(src);
        File file2 = new File(target);
        // 确保目标目录存在
        if (!file2.exists()) {
            file2.mkdirs();
        }
        // 获取源目录下的所有文件和子目录
        File[] files = file1.listFiles();
        if (files == null) {
            throw new RuntimeException("源目录不存在或不是目录: " + src);
        }
        for (File file : files) {
            // 构建目标文件/目录路径
            String targetPath = target + File.separator + file.getName();

            if (file.isDirectory()) {
                // 如果是目录，递归拷贝
                copyDirectory(file.getAbsolutePath(), targetPath);
            } else {
                // 如果是文件，直接拷贝
                copyFile(file.getAbsolutePath(), targetPath);
            }
        }
    }

    /**
     * 将一个目录中的文件与子目录递归拷贝到一个指定的目录中
     * @param src    源目录
     * @param target 目标目录
     */
    public static void recursiveCopy(String src, String target) {

    }

    /**
     * 拆分文件,将一个文件按照指定大小拆分成多个文件,每一个文件名字为:原名字_index,index从1开始,每次自增1
     * 提示:一个输入流,多个输出流,在输出时,每循环一次,输出一个子文件
     * @param path
     * @param length
     */
    public static void splitFile(String path, int length) {

    }

    /**
     * 合并文件,将之前拆分的文件合并为一个文件,将子文件的_index部分删除作为文件名
     * 提示:一个输出流,多个输入流
     * 传入的是第一个文件,会按照传入的文件的格式自动搜索所有同格式的文件,将这些文件进行合并
     * 文件格式:文件名_索引号
     * @param path
     */
    public static void mergeFile(String path) {

    }

    /**
     * 文件加密
     * 读取文件中的每一个字节,根据指定的密码对其进行加密,加密后的文件添加.sec后缀
     * 例如:a.txt --> a.txt.sec
     * 提示:将文件中读取的每一个字节都通过指定密码执行异或操作
     * @param file
     * @param password
     */
    public static void encoded(File file, int password) throws IOException {
        try (
                FileInputStream in = new FileInputStream(file);
                FileOutputStream out = new FileOutputStream(file.getAbsolutePath() + ".sec");
        ) {
            int i = -1;
            while ((i = in.read()) != -1) {
                out.write(i ^ password);
            }
        } catch (java.io.FileNotFoundException e) {
            throw e;
        } catch (IOException e) {
            throw e;
        }
    }

    /**
     * 文件解密
     * 读取加密后的文件中的每一个字节,根据指定的密码对其进行解密,解密后的文件去除.sec后缀
     * 例如:a.txt.sec --> a.txt
     * 提示:将文件中读取的每一个字节都通过指定密码再次执行异或操作
     * @param file
     * @param password
     */
    public static void decoded(File file, int password) throws IOException {
        try (
                FileInputStream in = new FileInputStream(file);
                FileOutputStream out = new FileOutputStream(file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf(".")));
        ) {
            int i = -1;
            while ((i = in.read()) != -1) {
                out.write(i ^ password);
            }
        } catch (java.io.FileNotFoundException e) {
            throw e;
        } catch (IOException e) {
            throw e;
        }
    }

    public static void main(String[] args) throws IOException {
        encoded(new File("hello.txt"),123);
        // decoded(new File("hello.txt.sec"), 123);
    }
}
